/*
 * Copyright 2021 Wicrenet, Inc. All rights reserved.
 */
package com.yinshu.teleshield.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DatePattern;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * 【 实体转换工具 】
 * @author yangjunxiong
 **/
@Slf4j
public class CommonBeanUtils extends BeanUtil {

    /**
     * 【 非空字段的拷贝 】
     * @param source 源 bean
     * @param target 目标 bean
     */
    public static void copyProperties(Object source, Object target) {
        BeanUtil.copyProperties(source, target, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
    }


    /**
     * 【 class转换工具 可以转换map，自定义对象互转 】
     *
     * @param targetClazz 目标类型
     * @param source 源 bean对象
     */
    public static <T> T convert(Class<T> targetClazz, Object source) {
        return Convert.convert(targetClazz, source);
    }


    /**
     * 【 list转换工具 】
     *
     * @param targetClazz 目标类型
     * @param source 源 bean对象list
     **/
    public static <T> List<T> toList(Class<T> targetClazz, Object source) {
        return Convert.toList(targetClazz, source);
    }

    /**
     * 【 json转list转换工具 】
     *
     * @param targetClazz 目标类型
     * @param source      源 json字符串
     **/
    public static <T> List<T> parseArray(String source, Class<T> targetClazz) {
        return JSONUtil.toList(source, targetClazz);
    }

    /**
     * 【 json转对象转换工具 】
     *
     * @param targetClazz 目标类型
     * @param source      源 json字符串
     **/
    public static <T> T parseObject(String source, Class<T> targetClazz) {
        return JSONUtil.toBean(source, targetClazz);
    }

    /**
     * 【 对象转json工具 】
     *
     * @param source 源 Object对象
     **/
    public static String toJSONString(Object source) {
        JSONConfig jsonConfig = JSONConfig.create().setDateFormat(DatePattern.NORM_DATETIME_PATTERN);
        return JSONUtil.toJsonStr(source, jsonConfig);
    }

    /**
     * 转化Page 对象
     *
     * @param page             分页对象
     * @param destinationClass 目标类型
     * @return 目录分页对象
     */
    public static <T, E> IPage<T> toBeanPage(IPage<E> page, Class<T> destinationClass) {
        if (page == null || destinationClass == null) {
            return null;
        }
        IPage<T> newPage = new Page<>(page.getCurrent(), page.getSize());
        newPage.setPages(page.getPages());
        newPage.setTotal(page.getTotal());
        List<E> list = page.getRecords();
        if (CollUtil.isEmpty(list)) {
            return newPage;
        }
        List<T> destinationList = toList(destinationClass, list);
        newPage.setRecords(destinationList);
        return newPage;
    }

}
